In [38]:
from numpy import *
from PIL import *
import pickle
from pylab import *
import os

In [39]:
import sift
import dsift
dsift = reload(dsift)
import imtools
imtools = reload(imtools)

In [40]:
def read_gesture_features_labels(path):
    # make a list of the files with .dsift at the end
    featlist = [os.path.join(path, f) for f in os.listdir(path)
               if f.endswith('.dsift')]
    
    # read features
    features = []
    for featfile in featlist:
        l, d = sift.read_features_from_file(featfile)
        features.append(d.flatten())
    features = array(features)
    
    # generate labels
    labels = [featfile.split('/')[-1][0] for featfile in featlist]
    
    return features, array(labels)

In [62]:
features, labels = read_gesture_features_labels('train/')
test_features, test_labels = read_gesture_features_labels('test/')
classnames = unique(labels)

In [63]:
# the first letter of the file name is the label
print labels


['F' 'C' 'A' 'V' 'A' 'B' 'A' 'F' 'V' 'P' 'F' 'P' 'V' 'C' 'A' 'V' 'V' 'C'
 'B' 'V' 'C' 'C' 'A' 'F' 'V' 'P' 'V' 'P' 'C' 'A' 'F' 'A' 'C' 'B' 'P' 'B'
 'B' 'F' 'V' 'B' 'A' 'C' 'B' 'C' 'C' 'V' 'A' 'B' 'A' 'P' 'P' 'P' 'F' 'B'
 'B' 'A' 'C' 'A' 'B' 'F' 'P' 'C' 'A' 'A' 'V' 'A' 'B' 'P' 'F' 'P' 'A' 'B'
 'V' 'F' 'B' 'A' 'F' 'F' 'C' 'V' 'B' 'V' 'C' 'F' 'P' 'P' 'A' 'F' 'P' 'P'
 'F' 'F' 'F' 'V' 'V' 'A' 'C' 'C' 'F' 'P' 'F' 'A' 'V' 'F' 'C' 'B' 'V' 'P'
 'B' 'C' 'P' 'V' 'P' 'F' 'V' 'V' 'C' 'A' 'B' 'C' 'F' 'P' 'C' 'B' 'V' 'P'
 'C' 'V' 'P' 'C' 'C' 'B' 'A' 'A' 'C' 'P' 'C' 'P' 'B' 'F' 'F' 'B' 'P' 'A'
 'A' 'C' 'F' 'P' 'V' 'C' 'B' 'V' 'B' 'F' 'B' 'A' 'V' 'C' 'F' 'B' 'F' 'V'
 'B' 'V' 'A' 'P' 'A' 'V' 'P' 'F' 'B' 'P' 'A' 'B']

In [64]:
import pca

In [65]:
V, S, m = pca.pca(features)

In [66]:
V = V[:2]  # take out the important features
features = array([dot(V, f-m) for f in features])
test_features = array([dot(V, f-m) for f in test_features])

In [67]:
import bayes
import poisson
poisson = reload(poisson)

In [68]:
bc = poisson.BayesClassifier()
blist = [features[where(labels==c)[0]] for c in classnames]

bc.train(blist, classnames)

In [69]:
res = bc.classify(test_features)[0]
print res
print test_labels


['A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A'
 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A']
['V' 'P' 'B' 'A' 'C' 'A' 'B' 'V' 'A' 'B' 'F' 'V' 'F' 'C' 'F' 'A' 'C' 'C'
 'B' 'F' 'V' 'F' 'V' 'C' 'B' 'B' 'F' 'P' 'B' 'B' 'A' 'B' 'V' 'P' 'C' 'F'
 'F' 'B' 'A' 'F' 'B' 'A' 'A' 'B' 'B' 'C' 'C' 'C' 'V' 'F' 'A' 'B' 'F' 'V'
 'P' 'V' 'B' 'P' 'C' 'C' 'A' 'B' 'P' 'P' 'F' 'F' 'B' 'F' 'C' 'P' 'F' 'P'
 'P' 'P' 'V' 'C' 'V' 'F' 'B' 'V' 'P' 'B' 'B' 'C' 'F' 'C' 'F' 'B' 'F' 'P'
 'A' 'P' 'A' 'P' 'C' 'C' 'V' 'P' 'C' 'C' 'P' 'C' 'F' 'F' 'C' 'C' 'F' 'C'
 'C' 'A' 'F' 'P' 'V' 'P' 'A' 'B' 'A' 'C' 'V' 'B' 'P' 'B' 'F' 'C' 'V' 'V'
 'P' 'A' 'F' 'P' 'P' 'V' 'F' 'F' 'F' 'P' 'V' 'P' 'C' 'A' 'F' 'V' 'V' 'F'
 'B' 'C' 'P' 'P' 'A' 'C' 'A' 'F' 'F' 'P' 'F' 'C' 'F' 'C' 'C' 'V' 'A' 'F'
 'A' 'A' 'B' 'P' 'V' 'A' 'F' 'F' 'B' 'A' 'F' 'V' 'B' 'C' 'A' 'A' 'F' 'P'
 'B' 'A' 'F' 'A' 'B' 'P' 'P' 'C' 'B' 'B' 'V' 'F' 'F' 'F' 'C' 'F' 'A' 'F'
 'C' 'V' 'F' 'V' 'P' 'F' 'P' 'P' 'P' 'V']

In [18]:
acc = sum(1.0*(res==test_labels[0]))/len(test_labels[0])
print 'Accuracy:', acc


Accuracy: 0.0

this is better than knn, what's going on?


In [17]:
def print_confusion(res, test_labels, classnames):
    
    n = len(classnames)
    
    class_ind = dict([(classnames[i], i) for i in range(n)])
    
    confuse = zeros((n, n))
    for i in range(len(test_labels)):
        confuse[class_ind[res[i]], class_ind[test_labels[i]]] += 1
    
    print 'Confusion matrix for'
    print classnames
    print confuse

In [15]:
print_confusion(res, test_labels, classnames)


Confusion matrix for
['A' 'B' 'C' 'F' 'P' 'V']
[[ 23.   1.   1.  13.   1.   0.]
 [  0.  26.   1.   5.   0.   0.]
 [  0.   0.  33.   2.   0.   0.]
 [  0.   1.   0.  24.   0.   0.]
 [  0.   2.   0.   0.  27.   1.]
 [  6.   2.   1.   3.   8.  27.]]

In [ ]: